<?php

namespace IYUU\sdk\CoolQ\Modules\chatbot;

use IYUU\sdk\ChatBot\ChatBot;
use IYUU\sdk\CoolQ\Context;
use IYUU\sdk\CoolQ\Event\Message as EventMessage;
use IYUU\sdk\CoolQ\ModulesProcessor;

/**
 * 腾讯自然语言处理(闲聊)
 * Class processor
 * @package IYUU\sdk\CoolQ\Modules\chatbot
 */
class processor extends ModulesProcessor
{
    /**
     * 应答方法 （抽象方法，子类实现）
     * @param Context $context
     * @param EventMessage $msgObj
     * @return array|string
     */
    public function respond(Context $context, EventMessage $msgObj)
    {
        // 1.取消息内容
        $message = $context->get('message');
        if (empty($message) || strlen($message) > 100) {
            return '';
        }

        // 2. 移除AT的CQ码
        if ($msgObj->isAtBot()) {
            $message = $msgObj->removeAtBot();
        }

        // 3. 上下文
        if ($this->inContext()) {
            /**
             * 结束上下文
             */
            if (in_array($message, ['exit', '取消', '退出', '算了'])) {
                $this->endContext();
                $resp = '腾讯自然语言处理，与您下次再见！';
                return EventMessage::reply($resp);
            }
        } else {
            /**
             * 开启上下文
             * - 如果是按照规则触发到本模块, 先启动上下文来锁定会话, 以保证下次回复依然执行到本模块
             */
            $this->beginContext(120);
        }

        // 4. 腾讯云配置
        $config = $msgObj->getConfig('TencentCloud');
        /**
         * 请求参数
         *   Query    是    String    用户请求的query
         *   OpenId    否    String    服务的id, 主要用于儿童闲聊接口，比如手Q的openid
         *   Flag    否    Integer    0: 通用闲聊, 1:儿童闲聊, 默认是通用闲聊
         */
        $params = array(
            'Query' => $message,
            //'Flag'  => mt_rand(0,1),
        );
        /**
         * 输出参数
         * - 示例：{"Reply":"海口今天最高温度33度，最低温度24度，多云","Confidence":1,"RequestId":"7828dd39-2cad-4686-b8de-51bf9e4bfe5b"}
         *   Reply    String    闲聊回复
         *   Confidence    Float    对于当前输出回复的自信度
         *   RequestId    String    唯一请求 ID，每次请求都会返回。定位问题时需要提供该次请求的 RequestId。
         */
        $resp = ChatBot::reply($config, $params);
        if (!empty($resp->Reply)) {
            $result = $resp->Reply;
            // 刷新上下文时限
            $this->refreshContext(120);
        } else {
            $result = '好难呀，我会努力学习的~';
        }

        // 调试日志
        //Logger::debug($message . PHP_EOL . $result, [], 'ChatBot');

        return $msgObj->isPrivate() ? $result : EventMessage::replyGroup($result, false, true);
    }
}
